﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZR.DataCollection2.Core;

namespace ImportPlcPointPosition.Utils
{
    public static class Ext
    {
        public static bool IsS7Array(this string dataType)
        {
            dataType = dataType.ToLower();
            return dataType.StartsWith("array[") && dataType.Contains("of");
        }

        public static bool IsS7Int16(this string parsetype)
        {
            parsetype = parsetype.ToLower();
            return parsetype.Equals("int") || parsetype.Equals("int16");
        }
        public static bool IsS7UInt16(this string parsetype)
        {
            parsetype = parsetype.ToLower();
            switch (parsetype)
            {
                case "word":
                    return true;
                default:
                    return false;
            }
        }
        /// <summary>
        /// 目前支持int16和uint16 (word)数组
        /// </summary>
        /// <param name="parsetype"></param>
        /// <returns></returns>
        public static bool IsS7ArrayInteger(this string parsetype)
        {

            if (SieminDecoder.IsArrayType(parsetype, out int arraylenth, out string type2))
            {
                return type2.IsS7Int16() || type2.IsS7UInt16();
            }
            return false;
        }
        public static bool IsS7ArrayReal(this string parsetype)
        {
            if (SieminDecoder.IsArrayType(parsetype, out int arraylenth, out string type2))
            {
                return type2.IsS7Real();
            }
            return false;
        }
        public static bool IsS7Real(this string parsetype)
        {
            parsetype = parsetype.ToLower();
            return parsetype.Equals("real");
        }
        public static bool IsS7ArrayString(this string parsetype)
        {
            if (SieminDecoder.IsArrayType(parsetype, out int arraylenth, out string type2))
            {
                return type2.IsS7String();
            }
            return false;
        }
        public static bool IsS7String(this string parsetype)
        {
            parsetype = parsetype.ToLower();
            return parsetype.StartsWith("string[");
        }

        public static double ToSafeDouble(this int value)
        {
            return (double)((decimal)value);
        }


        public static BindingList<T> AddRange<T>(this BindingList<T> my, List<T> items) 
        {
            foreach (var item in items)
            {
                my.Add(item);
            }

            return my;
        }


        public static bool ToBool(this object data)
        {
            if (data == null)
                return false;
            bool? value = GetBool(data);
            if (value != null)
                return value.Value;
            bool result;
            return bool.TryParse(data.ToString(), out result) && result;
        }
        private static bool? GetBool(this object data)
        {
            switch (data.ToString().Trim().ToLower())
            {
                case "0":
                    return false;
                case "1":
                    return true;
                case "是":
                    return true;
                case "否":
                    return false;
                case "yes":
                    return true;
                case "no":
                    return false;
                default:
                    return null;
            }
        }

    }
}
